package com.venus.util;

import com.venus.entity.Module;

import java.util.ArrayList;
import java.util.List;

public class TreeNodeList {

    /**
     * 获得一个树菜单：List<Module>转化成List<TreeNode>
     * @param moduleList 模块集合List<Module>
     * @return 树形菜单List<TreeNode>
     * */
    public static List<TreeNode> getTree(List<Module> moduleList) {
        //定义一个treeNode类型的集合用来装转化出的treeNode对象
        List<TreeNode> treeNodeList= new ArrayList<TreeNode>();
        //遍历module集合
        for (Module m : moduleList) {
            /*不是根节点不处理，只把根节点放集合返回出去
             * 不是根节点，就必然是某个根节点的子节点，就会被
             * childrenNode()处理，放入某个根节点中
             * */
            if(m.getModParentId()==0) {
                // 把module对象的数据转移到treeNode对象中
                TreeNode n = new TreeNode(m.getModName(), m.getModId(),
                        childrenNode(moduleList, m.getModId()), m.getModPath());
                // 把转化出的treeNode对象放入集合
                treeNodeList.add(n);
            }
        }
        return treeNodeList;
    }
    /**
     * 遍历模块集合，集合中某个元素的父id，等于传入的id，就是子节点
     * @param
     * 	moduleList 整个模块集合
     * 	mid父id
     * @return 子节点集合
     * */
    public static List<TreeNode> childrenNode(List<Module> moduleList, Integer mid) {
        List<TreeNode> childrenList= new ArrayList<TreeNode>();
        /* 外层循环遍历父，内层循环遍历子
         * 如果z的父id等于m的id，说明z是m的子
         * 此时的z和m还都是module，仍需要转化成treeNode
         * */
        for (Module z : moduleList) {
            if(mid.equals(z.getModParentId())) {
                TreeNode childrenNode=new TreeNode(z.getModName(), z.getModId(),
                        childrenNode(moduleList, z.getModId()), z.getModPath());
                //然后把这些z的兄弟放到集合里，哪个m调用的就传给谁
                childrenList.add(childrenNode);
            }
        }
        return childrenList;
    }

    /**
     * 递归的方式给每个子节点设置true，父节点设置null
     * @param
     * 	moduleList 自己的权限模块
     * 	treeList 整个树
     * @return 勾选好的树
     * */
    public static List<TreeNode> getCheckedTree(List<Module> moduleList, List<TreeNode> treeList) {
        for (TreeNode n : treeList) {// n:第一层，系统管理，课程管理
            if (!n.getChildren().isEmpty()) {// 如果第一层有子节点
                n.setChecked(null);// 就让第一层这个节点不设置checked
                for (TreeNode children : n.getChildren()) {// 遍历第二层
                    for (Module m : moduleList) {// 自己的权限
                        // 如果第二层的id和我的id相同，就勾上
                        if (m.getModId().equals(children.getId())) {
                            children.setChecked(true);
                        }
                    }
                }
                getCheckedTree(moduleList, n.getChildren());
            }
        }
        return treeList;
    }

}
